{
  lib,
  stdenv,
  callPackage,
  pythonPackagesExtensions,
  config,
  makeScopeWithSplicing',
  ...
}:

{
  implementation,
  libPrefix,
  executable,
  sourceVersion,
  pythonVersion,
  packageOverrides,
  sitePackages,
  hasDistutilsCxxPatch,
  pythonOnBuildForBuild,
  pythonOnBuildForHost,
  pythonOnBuildForTarget,
  pythonOnHostForHost,
  pythonOnTargetForTarget,
  pythonAttr ? null,
  pythonABITags ? [ "none" ],
  self, # is pythonOnHostForTarget
}:
let
  pythonPackages =
    let
      ensurePythonModules =
        items:
        let
          exceptions = [
            stdenv
          ];
          providesSetupHook = lib.attrByPath [ "provides" "setupHook" ] false;
          valid =
            value: pythonPackages.hasPythonModule value || providesSetupHook value || lib.elem value exceptions;
          func =
            name: value:
            if lib.isDerivation value then
              lib.extendDerivation (
                valid value
                || throw "${name} should use `buildPythonPackage` or `toPythonModule` if it is to be part of the Python packages set."
              ) { } value
            else
              value;
        in
        lib.mapAttrs func items;
    in
    ensurePythonModules (
      callPackage
        # Function that when called
        # - imports python-packages.nix
        # - adds spliced package sets to the package set
        # - applies overrides from `packageOverrides` and `pythonPackagesOverlays`.
        (
          {
            pkgs,
            stdenv,
            python,
            overrides,
          }:
          let
            pythonPackagesFun = import ./python-packages-base.nix {
              inherit stdenv pkgs lib;
              python = self;
            };
            otherSplices = {
              selfBuildBuild = pythonOnBuildForBuild.pkgs;
              selfBuildHost = pythonOnBuildForHost.pkgs;
              selfBuildTarget = pythonOnBuildForTarget.pkgs;
              selfHostHost = pythonOnHostForHost.pkgs;
              selfTargetTarget = pythonOnTargetForTarget.pkgs or { }; # There is no Python TargetTarget.
            };
            hooks = import ./hooks/default.nix;
            keep = self: hooks self { };
            optionalExtensions = cond: as: lib.optionals cond as;
            pythonExtension = import ../../../top-level/python-packages.nix;
            python2Extension = import ../../../top-level/python2-packages.nix;
            extensions = lib.composeManyExtensions (
              [
                hooks
                pythonExtension
              ]
              ++ (optionalExtensions (!self.isPy3k) [
                python2Extension
              ])
              ++ pythonPackagesExtensions
              ++ [
                overrides
              ]
            );
            aliases =
              self: super:
              lib.optionalAttrs config.allowAliases (import ../../../top-level/python-aliases.nix lib self super);
          in
          makeScopeWithSplicing' {
            inherit otherSplices keep;
            f = lib.extends (lib.composeExtensions aliases extensions) pythonPackagesFun;
          }
        )
        {
          overrides = packageOverrides;
          python = self;
        }
    );
in
rec {
  isPy27 = pythonVersion == "2.7";
  isPy37 = pythonVersion == "3.7";
  isPy38 = pythonVersion == "3.8";
  isPy39 = pythonVersion == "3.9";
  isPy310 = pythonVersion == "3.10";
  isPy311 = pythonVersion == "3.11";
  isPy312 = pythonVersion == "3.12";
  isPy313 = pythonVersion == "3.13";
  isPy314 = pythonVersion == "3.14";
  isPy2 = lib.strings.substring 0 1 pythonVersion == "2";
  isPy3 = lib.strings.substring 0 1 pythonVersion == "3";
  isPy3k = isPy3;
  isPyPy = lib.hasInfix "pypy" interpreter;

  buildEnv = callPackage ./wrapper.nix {
    python = self;
    inherit (pythonPackages) requiredPythonModules;
  };
  withPackages = import ./with-packages.nix { inherit buildEnv pythonPackages; };
  pkgs = pythonPackages;
  interpreter = "${self}/bin/${executable}";
  inherit
    executable
    implementation
    libPrefix
    pythonVersion
    sitePackages
    ;
  inherit sourceVersion;
  pythonAtLeast = lib.versionAtLeast pythonVersion;
  pythonOlder = lib.versionOlder pythonVersion;
  inherit hasDistutilsCxxPatch;
  inherit pythonOnBuildForHost;
  inherit pythonABITags;

  tests = callPackage ./tests.nix {
    python = self;
  };

  inherit pythonAttr;
}
